package chapter09plus

/**
  *
  * @author Pop
  * @date 2022/7/5 23:34
  */
object Test03_Generics {
  def main(args: Array[String]): Unit = {
    // 逆变和协变
      val child:Parent = new Child

    val childList:MyCollection[Parent] = new MyCollection[Parent]
  // 协变，即创建的实例泛型，可以是声明泛型的子类
    val childList1:MyCollection1[Parent] = new MyCollection1[Child]
    // 逆变。即创建的实例泛型，可以是声明泛型的父类
    val childList2:MyCollection2[SubChild] = new MyCollection2[Child]

    // 泛型的上下限
    // 上限，即表示，传入的A泛型，层级不能超过Child，可以是Child的子类
    // 也可以是Child
    def test[A <: Child](a:A):Unit = {
      println(a.getClass)
    }
//    test[Parent](new SubChild) 运行会报错
    test[Child](new Child)
    // 下限，不能是child的子类
    def test1[A >: Child](a:A):Unit = {
      println(a.getClass)
    }
    test1[Parent](new Parent)
  }
}

class Parent{}
class Child extends Parent {}
class SubChild extends Child {}

class MyCollection[E]{}
class MyCollection1[+E]{}
class MyCollection2[-E]{}


